home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dicecache / cache.c next >
C/C++ Source or Header  |  1997-09-09  |  3KB  |  151 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  CACHE.C
  9.  */
  10.  
  11. #include "defs.h"
  12.  
  13. Prototype CacheNode *FindCache(BPTR, char *);
  14. Prototype void AddCache(CacheNode *);
  15. Prototype void ClearCache(long);
  16.  
  17. CacheNode *
  18. FindCache(lock, buf)
  19. BPTR lock;
  20. char *buf;
  21. {
  22.     long hv = ((FileLock *)((long)lock << 2))->fl_Key;
  23.     List *list;
  24.     CacheNode *cn;
  25.     __aligned FileInfoBlock fib;
  26.  
  27.     dbprintf(("HV %08lx %d (%s) ", hv, hv & HMASK, buf));
  28.  
  29.     list = CacheList + (hv & HMASK);
  30.     for (cn = GetHead(list); cn; cn = GetSucc(&cn->cn_Node)) {
  31.     dbprintf(("TEST1 %s\n", cn->cn_Node.ln_Name));
  32.     if (cn->cn_Flags & CNF_UNFIND)
  33.         continue;
  34.     dbprintf(("TEST2 %08lx %08lx %d\n",
  35.         hv,
  36.         ((FileLock *)((long)cn->cn_Lock << 2))->fl_Key,
  37.         MySameLock(lock, cn->cn_Lock)
  38.     ));
  39.  
  40.     if (hv == ((FileLock *)((long)cn->cn_Lock << 2))->fl_Key && MySameLock(lock, cn->cn_Lock) == LOCK_SAME) {
  41.         /*
  42.          *    In correct directory, check filename
  43.          */
  44.         if (stricmp(buf, cn->cn_Node.ln_Name) == 0)
  45.         break;
  46.     }
  47.     }
  48.  
  49.     /*
  50.      *    Ensure that the file is not out of date
  51.      */
  52.  
  53.     if (cn) {
  54.     BPTR lock2;
  55.  
  56.     dbprintf(("FOUND\n"));
  57.     cn->cn_Flags |= CNF_UNFIND;
  58.  
  59.     lock = CurrentDir(lock);
  60.     if (lock2 = Lock(buf, SHARED_LOCK)) {
  61.         if (Examine(lock2, &fib)) {
  62.         dbprintf(("CHECKDATE %08lx %08lx",
  63.             fib.fib_Date.ds_Days + fib.fib_Date.ds_Minute + fib.fib_Date.ds_Tick,
  64.             cn->cn_Fib.fib_Date.ds_Days + cn->cn_Fib.fib_Date.ds_Minute + cn->cn_Fib.fib_Date.ds_Tick
  65.         ));
  66.  
  67.         if (fib.fib_Date == cn->cn_Fib.fib_Date) {
  68.             dbprintf(("OK\n"));
  69.             cn->cn_Flags &= ~CNF_UNFIND;
  70.         } else {
  71.             dbprintf(("NOT OK\n"));
  72.         }
  73.         }
  74.         UnLock(lock2);
  75.     }
  76.     lock = CurrentDir(lock);
  77.     if (cn->cn_Flags & CNF_UNFIND) {
  78.         if (cn->cn_Refs == 0)
  79.         DiceCacheClose(cn);
  80.         cn = NULL;
  81.     }
  82.     } else {
  83.     dbprintf(("NOT FOUND\n"));
  84.     }
  85.     return(cn);
  86. }
  87.  
  88. void
  89. AddCache(cn)
  90. CacheNode *cn;
  91. {
  92.     long hv = ((FileLock *)((long)cn->cn_Lock << 2))->fl_Key;
  93.     List *list;
  94.     BPTR lock;
  95.     BPTR lock2;
  96.  
  97.     list = CacheList + (hv & HMASK);
  98.     AddHead(list, &cn->cn_Node);
  99.  
  100.     lock = CurrentDir(cn->cn_Lock);
  101.     if (lock2 = Lock(cn->cn_Node.ln_Name, SHARED_LOCK)) {
  102.     Examine(lock2, &cn->cn_Fib);
  103.     UnLock(lock2);
  104.     }
  105.     CurrentDir(lock);
  106. }
  107.  
  108. /*
  109.  *  ClearCache(need)
  110.  *
  111.  *  we need <need> bytes.  The cache currently contains CachedBytes,
  112.  *  a maximum of CacheMax.  We need to remove P percent of our cache
  113.  *
  114.  *    clear = need - (CacheMax - CachedBytes)     bytes to clear
  115.  *
  116.  */
  117.  
  118. void
  119. ClearCache(bytes)
  120. long bytes;
  121. {
  122.     long clear = bytes - (CacheMax - (CachedBytes - CachedBytesLocked));
  123.     long index = rand() % ((CachedBytes - CachedBytesLocked) - clear);
  124.     short i;
  125.     List  *list;
  126.     CacheNode *cn;
  127.     CacheNode *cn_next;
  128.  
  129.     if (clear <= 0)
  130.     return;
  131.     if (clear > CachedBytes - CachedBytesLocked)
  132.     index = 0;
  133.  
  134.     for (i = 0, list = CacheList; i < HSIZE; ++i, ++list) {
  135.     for (cn = GetHead(list); cn; cn = cn_next) {
  136.         cn_next = GetSucc(&cn->cn_Node);
  137.         if (cn->cn_Refs == 0) {
  138.         if (index < cn->cn_Bytes) {
  139.             index -= cn->cn_Bytes;
  140.             DiceCacheClose(cn);
  141.         } else {
  142.             index -= cn->cn_Bytes;
  143.         }
  144.         }
  145.         if (index + clear <= 0)
  146.         return;
  147.     }
  148.     }
  149. }
  150.  
  151.